#include "command.h"

#include <string.h>
#include <stdio.h>

const char *help_messages[] = {
    "login: 用于登录到系统。使用方法: login",
    "signup: 用于注册新用户。使用方法: signup",
    "quit: 退出程序。使用方法: quit",
    "ls: 列出当前目录下的文件和文件夹。使用方法: ls",
    "ll: 列出当前目录下的文件和文件夹的详细信息。使用方法: ll",
    "cd: 切换目录。使用方法: cd <目录路径>",
    "pwd: 显示当前所在目录。使用方法: pwd",
    "remove: 删除文件或文件夹。使用方法: remove <文件或文件夹路径>",
    "mv: 移动文件或文件夹。使用方法: mv <源路径> <目标路径>",
    "mkdir: 创建新目录。使用方法: mkdir <目录路径>",
    "upload: 上传文件。使用方法: upload <本地文件路径> <远程保存路径>",
    "download: 下载文件。使用方法: download <远程文件路径> <本地保存路径>",
    "help: 显示帮助信息。使用方法: help <命令>"};

Command_t parseCommand(const char *input)
{
    Command_t command;
    memset(&command, 0, sizeof(command)); // 避免无参导致结构体成员随机值
    char cmd[10];                         // 预计指令长度小于10

    // 读取参数
    sscanf(input, "%10s %255[^\n ] %255[^\n]", cmd, command.arg1, command.arg2); // 中间255后的空格必须留着
    strcpy(command.name, cmd);

    if (strcmp(cmd, "login") == 0)
    {
        command.type = CMD_LOGIN;
    }
    else if (strcmp(cmd, "signup") == 0)
    {
        command.type = CMD_SIGNUP;
    }
    else if (strcmp(cmd, "quit") == 0)
    {
        command.type = CMD_QUIT;
    }
    else if (strcmp(cmd, "ls") == 0)
    {
        command.type = CMD_LS;
    }
    else if (strcmp(cmd, "ll") == 0)
    {
        command.type = CMD_LL;
    }
    else if (strcmp(cmd, "cd") == 0)
    {
        command.type = CMD_CD;
    }
    else if (strcmp(cmd, "pwd") == 0)
    {
        command.type = CMD_PWD;
    }
    else if (strcmp(cmd, "remove") == 0)
    {
        command.type = CMD_REMOVE;
    }
    else if (strcmp(cmd, "mv") == 0)
    {
        command.type = CMD_MV;
    }
    else if (strcmp(cmd, "mkdir") == 0)
    {
        command.type = CMD_MKDIR;
    }
    else if (strcmp(cmd, "download") == 0)
    {
        command.type = CMD_DOWNLOAD;
    }
    else if (strcmp(cmd, "upload") == 0)
    {
        command.type = CMD_UPLOAD;
    }
    else if (strcmp(cmd, "help") == 0)
    {
        command.type = CMD_HELP;
    }
    else
    {
        command.type = CMD_INVALID;
        strcpy(command.name, "invalid");
    }

    return command;
}

bool isValidCommand(CommandType_t cmd_type)
{
    switch (cmd_type)
    {
    case CMD_LOGIN:
    case CMD_SIGNUP:
    case CMD_QUIT:
    case CMD_LS:
    case CMD_LL:
    case CMD_CD:
    case CMD_PWD:
    case CMD_REMOVE:
    case CMD_MV:
    case CMD_MKDIR:
    case CMD_DOWNLOAD:
    case CMD_UPLOAD:
    case CMD_HELP:
        return true;
    default:
        return false;
    }
}

void handleHelpCommand(const char *command)
{
    if (command == NULL || strlen(command) == 0)
    {
        // 如果没有提供具体命令，列出所有命令
        for (size_t i = 0; i < sizeof(help_messages) / sizeof(help_messages[0]); i++)
        {
            printf("%s\n", help_messages[i]);
        }
    }
    else
    {
        // 查找并显示特定命令的帮助信息
        for (size_t i = 0; i < sizeof(help_messages) / sizeof(help_messages[0]); i++)
        {
            if (strstr(help_messages[i], command) == help_messages[i])
            {
                printf("%s\n", help_messages[i]);
                return;
            }
        }
        printf("未知命令: %s\n", command);
    }
}